package com.okami.java8.method.reference;

/**
 * @description: 未绑定的方法引用
 * @author: TanJingyu
 * @create: 2020-09-11 17:26
 **/
class X {
    String f() { return "X::f()"; }
}

interface MakeString {
    String make();
}

interface TransformX {
    String transform(X x);
}

/**
 *  X的f方法是非static方法，所以调用f方法必须通过X的实例对象，也就是说f方法必须要绑定到对象上
 *  现在的f方法就是未绑定的方法，所以不可以直接 X::f赋值
 *  解决办法：
 *      ①将f方法设为static，让f方法的调用不依赖对象
 *      ②在类似TransformX的transform方法入参加入x对象，也就是给f方法一个对象，让其绑定
 *      ③用对象的方式： X x = new X(); TransformX sp = x::f;
 */
public class UnboundMethodReference {
    public static void main(String[] args) {
        // MakeString ms = X::f;
        TransformX sp = X::f;
        X x = new X();
        System.out.println(sp.transform(x));
        System.out.println(x.f());
    }
}
